#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=150010,M=10000010;
int n,a,b,tot,first[N],nnext[M],to[M],vis[N],w[M],tp[M];
ll dis[N];
void add(int x,int y,int z,int op){
	nnext[++tot]=first[x];
	first[x]=tot;
	to[tot]=y;
	w[tot]=z;
	tp[tot]=op;
}
void dij(){
	int u;
	priority_queue<pair<ll,int> >q;
	dis[1]=vis[1]=0;
	for(int i=2;i<=n;i++){
		dis[i]=1e18;
		vis[i]=0;
	}
	q.push({0,1});
	while(!q.empty()){
		u=q.top().second;
		q.pop();
		if(vis[u]){
			continue;
		}
		vis[u]=1;
		for(int e=first[u];e;e=nnext[e]){
			if(dis[u]+w[e]<dis[to[e]]){
				dis[to[e]]=dis[u]+w[e];
				q.push({-dis[to[e]],to[e]});
			}
		}
	}
}
namespace Sub1{
	vector<int>stk;
	vector<pair<int,int> >ans;
	void dfs(int u,int st,int dep){
		if(dep==2){
			ans.push_back({st,u});
			return;
		}
		vis[u]=1;
		stk.push_back(u);
		for(int e=first[u];e;e=nnext[e]){
			if(tp[e]==0&&!vis[to[e]]){
				dfs(to[e],st,dep+1);
			}
		}
	}
	void solve(){
		for(int i=1;i<=n;i++){
			dfs(i,i,0);
			for(auto j:stk){
				vis[j]=0;
			}
			stk.clear();
			for(auto j:ans){
				add(j.first,j.second,b,1);
			}
			ans.clear();
		}
		dij();
		for(int i=2;i<=n;i++){
			printf("%lld\n",dis[i]);
		}
	}
}
namespace Sub2{
	void solve(){
		dij();
		for(int i=2;i<=n;i++){
			printf("%lld\n",(dis[i]/a)%2?(dis[i]-a)/2/a*b+a:dis[i]/2/a*b);
		}
	}
}
int main(){
	freopen("edge.in","r",stdin);
	freopen("edge.out","w",stdout);
	int m,x,y;
	scanf("%d%d%d%d",&n,&m,&a,&b);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		add(x,y,a,0);
		add(y,x,a,0);
	}
	if(m==n-1){
		Sub2::solve();
	}
	else{
		Sub1::solve();
	}
}